//
//  AVAudioPlayerPool.swift
//  Demo-18 使用多个AVAudioPlayer
//
//  Created by quanhao huang on 2019/12/27.
//  Copyright © 2019 quanhao huang. All rights reserved.
//

import UIKit
import AVFoundation
/**
虽然可以使用多个AVAudioPlayer，但通常情况下为了保证性能应该尽可能重用AVAudioPlayer
 1.用一个数组保存了所有的AVAudioPlayer对象
 2.索取AVAudioPlayer对象时他会先去查询是否有空闲的AVAudioPlayer对象，如果找到则返回，节省资源
 3.如果没有找到，要么是相同URL（播放的相同声音），要么就是没有空闲的AVAudioPlayer对象，这时候则会NEW一个新的AVAudioPlayer，当新的AVAudioPlayer播放完毕后，我们又可以重用它了。
*/

//存放所有的AVAudioPlayer，私有，外部不可见
private var players:[AVAudioPlayer] = []

class AVAudioPlayerPool: NSObject {

    //指定声音文件URL，有空闲重用，没空闲创建AVAudioPlayer
    func playerWithURL(url:URL) -> AVAudioPlayer? {
        
        //查找一个空闲的AVAudioPlayer
        let availabelPlayers = players.filter { (player) -> Bool in
            return player.isPlaying == false && player.url == url
        }
        
        //如果找到，返回AVAudioPlayer对象
        if let playerToUse = availabelPlayers.first{
            return playerToUse
        }
        
        //没有找到，新建一个AVAudioPlayer对象
        do {
            let newPlayer = try AVAudioPlayer(contentsOf: url)
            players.append(newPlayer)
            return newPlayer
        } catch {
            print(error)
        }
        return nil
    }
}
